package Dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author fly
 * @create 2021--04--25--14:34
 */
public class Test1 {
    public static void main(String[] args) {
        MaoTaiJiu maoTaiJiu=new MaoTaiJiu();
        InvocationHandler jinxiao1=new DaiLi(maoTaiJiu);

        WuLiangYe wuLiangYe=new WuLiangYe();
        InvocationHandler jinxiao2=new DaiLi(wuLiangYe);




        SellWine dy1= (SellWine)Proxy.newProxyInstance(MaoTaiJiu.class.getClassLoader(),
                MaoTaiJiu.class.getInterfaces(),jinxiao1);
        dy1.maiJiu();

        SellWine dy2=(SellWine)Proxy.newProxyInstance(WuLiangYe.class.getClassLoader(),
                WuLiangYe.class.getInterfaces(),jinxiao2);
        dy2.maiJiu();

        FuRongWang fuRongWang=new FuRongWang();
        InvocationHandler jinxiao3=new DaiLi(fuRongWang);

        InvocationHandler jinxiao4=new DaiLi(fuRongWang);
        SellCigarette dy3=(SellCigarette)Proxy.newProxyInstance(FuRongWang.class.getClassLoader(),
                FuRongWang.class.getInterfaces(),jinxiao3);
        dy3.sell(1);

        SellCigarette dy4=(SellCigarette)Proxy.newProxyInstance(FuRongWang.class.getClassLoader(),
                FuRongWang.class.getInterfaces(),jinxiao4);
        dy3.sell(2);
        //方法调用时，会转到对应的InvocationHandler上执行invoke方法，invoke方法的两个参数：InvocationHandler的成员变量和args
        //也就是真实实现类的对象和对应方法的args，然后就是去执行对应类中的method方法

        System.out.println("dy1代理对象的名字："+dy1.getClass().getName());
        System.out.println("dy2代理对象的名字："+dy2.getClass().getName());
        System.out.println("dy3代理对象的名字："+dy3.getClass().getName());
        System.out.println("dy4代理对象的名字："+dy4.getClass().getName());

       // System.out.println(System.getProperty("java.class.path"));
    }
}
